//
// Description: 5789. 你完成的完整对局数
// Created by Loading on 2021/6/20.
//

#include <bits/stdc++.h>

using namespace std;

int numberOfRounds(string startTime, string finishTime) {
    //根据字符串，截取开始时间时分和结束时间时分
    int startTimeH = stoi(startTime.substr(0, 2));
    int startTimeM = stoi(startTime.substr(3));
    int finishTimeH = stoi(finishTime.substr(0, 2));
    int finishTimeM = stoi(finishTime.substr(3));

    /* 同一小时内，结束时间与开始时间间隔小于 15 分钟，对局为 0 */
    /* case："00:47", "00:57" */
    if (finishTimeH == startTimeH && finishTimeM > startTimeM && finishTimeM - startTimeM < 15) {
        return 0;
    }

    //去除无效时间，使开始时间和结束时间都卡在正好完成对局和开始对局的时间
    if (startTimeM % 15 != 0) {
        startTimeM = startTimeM / 15 * 15 + 15;
        if (startTimeM == 60) {//跨小时
            startTimeM = 0;
            startTimeH++;
            if (startTimeH == 24) {//跨天
                startTimeH = 0;
            }
        }
    }
    if (finishTimeM % 15 != 0) {
        finishTimeM = finishTimeM / 15 * 15;
    }

    /* 整体思想是计算结束时间和开始时间相差多少分钟，除以 15 即可 */
    /* (finishTimeH - startTimeH + 24) % 24 * 60，加 24 然后对 24 取余，防止跨天 ，例如：23：00-22：00 */
    /* 加 24 * 60 然后对 24 * 60 取余，防止跨天，例如：00：01-00：00 */
    int max_games =
            (((finishTimeH - startTimeH + 24) % 24 * 60 + (finishTimeM - startTimeM)) + 24 * 60) % (24 * 60) / 15;

    return max_games;
}

/* 最佳解答 */
int numberOfRounds_best(string startTime, string finishTime) {
    /* 转化为分钟，使用分钟累加，最后除以 15 */
    int t0 = 60 * stoi(startTime.substr(0, 2)) + stoi(startTime.substr(3));
    int t1 = 60 * stoi(finishTime.substr(0, 2)) + stoi(finishTime.substr(3));
    if (t1 < t0) {
        // 此时 finishTime 为第二天，累加第一天的分钟数
        t1 += 24 * 60;
    }
    // 计算第一个小于等于 finishTime 的对局结束时间，此时间至结束时间为无效时间，不可能完成对局，舍弃
    t1 = t1 / 15 * 15;

    /* case："00:47", "00:57" ，会导致 t1 - t0 < 0 */
    return max(0, (t1 - t0)) / 15;
}

int main() {
    string startTime = "00:01";
    string finishTime = "00:00";
    cout << numberOfRounds(startTime, finishTime) << endl;

    cout << numberOfRounds_best(startTime, finishTime) << endl;
}